var autoObjList = new Array();
var txtArea;
var intelMainDiv;
var utilsAutoComplete = null;
$(document).ready(function(){

	utilsAutoComplete = new UtilsAutoComplete();
	var mainControler = new AutoCompleteControler();
	mainControler.init();
	mainControler.Interface.hide();
	
});
function AutoCompleteControler(){
	var t = this;
	t.Dictonary = new Dictonary();
	t.AutoCompleteElemtes = new Array();
	t.Interface = new AutoCompleteUI();
	t.CurrentMatches = new Array();
	t.SelectedTextArea = null;
	t.init = function(){
		var pItem;
		$('.autoCompleteTextArea').each(function(index,obj){
			
			pItem = new AutoCompleteTextArea(obj);
			pItem.NavigatedThroughList = false;
			pItem.init(t.delegateKeyUp, t.delegateKeyDown,t.callBackFocus);
		});

	};
	t.delegateKeyUp = function(event){
		if (this.NavigatedThroughList){
			this.NavigatedThroughList = false;
			return false;
		}
		//if(event.keyCode == utilsAutoComplete.KEYCODEOBJ.LEFT || event.keyCode == utilsAutoComplete.KEYCODEOBJ.RIGHT)	 return;
		t.currentMatches = t.Dictonary.getMatches(this.getCurrentWord(),t.currentMatches);

		if( t.currentMatches != null  && t.currentMatches.length > 0 ){
			t.Interface.updateListView(t.currentMatches);
			t.Interface.postionInterface(t.SelectedTextArea);
		}
		else{
			t.Interface.hide();
			return false ;
		}
	};
	t.delegateKeyDown = function(event){
		if(t.Interface.NavigateThroughList(this,event)){
			this.NavigatedThroughList = true;
			return false;
		}
	};
	t.callBackFocus = function(){

		t.Interface.hide();
		t.SelectedTextArea = this;
	};
}
function AutoCompleteTextArea(domObj){
	var t = this;
	t.domObj = $(domObj);
	t.init = function(keyUpCallBack , keyDownCallBack,focusCallBack){

		t.domObj.keyup(function(event) {
		   if(! keyUpCallBack.call(t,event)) return;
		});
		t.domObj.keydown(function(event) {
			if(! keyDownCallBack.call(t,event)) return;
		});
		$(t.domObj).focus(function(event) {
			if(! focusCallBack.call(t)) return;
		});

	};
	t.getCurrentWord = function(){
		var currentWord;
		var currentText;
		var currentTextLength;
		var indexBeginn;
		var cursorPosition;
		var $xTxtArea = $(t.domObj);
		currentText = "" + $xTxtArea .val();
		currentTextLength = currentText.length;

		if(currentTextLength < 3) return "";

		cursorPosition = $xTxtArea.prop("selectionStart");
		indexBeginn = utilsAutoComplete.getSubStringTillPreviousSeperator(currentText,cursorPosition);
		currentWord  = currentText.substring(indexBeginn,cursorPosition);

		return currentWord;
	};
}
function Dictonary(){
	var t = this;
	
	t.entryList = new Array();
	t.entryList.push(new DictonaryEntry("Kommunizieren","(Störungen der) Kommunikation im Hinblick auf Minderung von Hörvermögen, Sehvermögen, Sprachliche Probleme (Aphasien) ggf. auch Kognition, ggf. auch taktile Probleme Wahrnehmungsfähigkeit des Pflegebedürftigen, Ausdruck v. Gefühlen, Gestik, Mimik, die emotionalen Bedürfnisse, Sprache, Schreiben, Hören, Sehen, Erinnerung, Konzentrationsvermögen"));
	t.entryList.push(new DictonaryEntry("Sich bewegen","Fähigkeit, die Lage im Bett zu verändern, Fähigkeit zu sitzen, zu stehen und zu gehen sowie Transfers wie Bett zu Stuhl, Rollstuhl zu Toilette etc., durchzuführen.  , . Nutzung der Arme, Beweglichkeit des Kopfes und Rumpfes; Feinmotorische Fähigkeiten (z.B. greifen)"));
	t.entryList.push(new DictonaryEntry("Sich Pflegen","die Fähigkeit, die alltägliche Körperpflege durchzuführen. Hierunter fällt die Reinigung des Körpers, die Pflege der Haare einschl. Rasur, Mundpflege, Augen-, Nasen- und Ohrenpflege, Hautzustand, Hautschäden, Nagelpflege."));
	t.entryList.push(new DictonaryEntry("Vitale Funktionen des Lebens aufrechterhalten","Regulierung der Körpertemperatur, Störungen der Atmung, des Stoffwechsels etc. Sollte der Katalog möglichst begrenzt gehalten werden könnte dies auch im Bereich \"Gesundheit\"  aufgehen.  Vitalzeichen, Blutdruck, Puls, Blutzucker, Atemfähigkeit,  Wärmeregulation."));
	t.entryList.push(new DictonaryEntry("Essen / Trinken","Ernährungszustand, Fähigkeit Essen und Trinken in ausreichendem Maße zu sich zu nehmen (Nahrungs- und Flüssigkeitsaufnahme), auch mundgerechte Zubereitung der Mahlzeiten, Kostformen und Diäten; ggf. auch Besonderheiten Ernährung oral oder über Sondenernährung (Arten: Pumpen, Bolusgabe, Schwerkraft wie Ernährungssonde oder Ernährung vollständig über Infusionen (z.B. Port), Kostformen, Bedürfnisse, Genuß bei der Nahrungsaufnahme, Anreichen, Essstörungen"));
	t.entryList.push(new DictonaryEntry("Ausscheiden","Störungen der Ausscheidung, insbesondere Harn- und Stuhlkinkontinenz, Blasenent-leerungsstörungen, chronische Obstipation oder Diarrhoe. Einsatz von Hilfsmittel wie  Harnableistung über  suprapubischer Dauerkathether, transurethraler Dauerkathether, Urostoma, intermittierender Katheterismus, Kondomurinal bzw. Stuhlausscheidung über  Colo oder Ileostoma,  Störungen bei Ausscheidungen können sich auch durch anhaltendes Erbrechen oder übermäßige Schweißproduktion.äußern. "));
	t.entryList.push(new DictonaryEntry("Sich Kleiden","Auswahl geeigneter Kleidung, An- und Auskleiden. Da Der Wäschewechsel sehr oft im zeitlichen Zusammenhang mit der Körperpflege oder der Ausscheidung steht könnte die Aktivität als eigenständiger Bereich entfallen."));
	t.entryList.push(new DictonaryEntry("Ruhen / Schlafen","Störungen beim Ein- / Durchschlafen, gestörter Tag-Nacht-Rhythmus, Rituale, erhöhter Ruhebedarf (z.B. bei Fatigue-Syndrom)und reduzierte Belastbarkeit = rasche Erschöpfung. Schlafgewohnheiten, Schlafstörungen, Schlafrhythmus"));
	t.entryList.push(new DictonaryEntry("Sich Beschäftigen","Tagesgestaltung, Hobbys, selbständige Aktivitäten"));
	t.entryList.push(new DictonaryEntry("Sich als Mann oder Frau fühlen","Sexualität, Rollenidentität, geschlechtsspezifische Kleidung"));
	t.entryList.push(new DictonaryEntry("Für eine sichere Umgebung sorgen","Risiken: psychische Sicherheit, physische Sicherheit (z.B. Sturzrisiko), Orientierungshilfen,Dekubitusrisiko, Sturzrisiko, Dehydrierungsrisiko, Thromboserisiko, Pneumonie- und Kon-trakturenrisiko materielle Sicherheit! Einbruchschutz, Erkennung von Gefahren (Brand etc.)"));
	t.entryList.push(new DictonaryEntry("Soziale Bereiche des Lebens sichern","Die bestehenden Beziehungen aufrechterhalten (Bekannte,Verwandte) bzw. zu erweitern bzw. wieder herzustellen."));
	t.entryList.push(new DictonaryEntry("Mit existenziellen Erfahrungen umgehen","Sterben und Tod, Glaube/Religiosität, lebensgeschichtliche Erfahrungen"));
	t.entryList.push(new DictonaryEntry("Sonstiges","z.B. Erfassung von Schmerzen und Wunden, Geschwüre"));
	t.entryList.push(new DictonaryEntry("Motivation / innerer Antrieb","Begeisterungsfähigkeit, Eigeninitiative, Sinnorientierung etc"));
	t.entryList.push(new DictonaryEntry("Orientierung","räumliche, zeitliche, situative, personenbezogene Orientierung"));
	t.entryList.push(new DictonaryEntry("Gedächtnis","Kurz-/Langzeitgedächtnis, Merkfähigkeit etc."));
	t.entryList.push(new DictonaryEntry("Sonstige kognitive Funktionen","Auseinandersetzung mit der Umwelt, Urteilsvermögen, Aufmerksamkeit-/Konzentration, Auffassung, Lernfähigkeit, Kreativität, Körperwahrnehmung bzw. Körperschema"));
	t.entryList.push(new DictonaryEntry("Affektivität / Gefühl / Emotion","situationsunangemessene/angemessene Gefühlsausbrüche/Mimik/Gestik, Fähigkeit Gefühle auszudrücken etc."));
	t.entryList.push(new DictonaryEntry("Gesundheitsverhalten","Ernährung u. Flüssigkeitsaufnahme, Gebrauch/Missbrauch/Abhängigkeit von Suchtmitteln"));
	t.entryList.push(new DictonaryEntry("Einkaufen / Besorgungen","Beschaffung von Lebensmitteln und Dinge des täglichen Bedarfs, Kleidung, sonstige Ausstattungsgegenstände. Beschaffung von Rezepten und Verordnung, Besorgung von Medikamenten "));
	t.entryList.push(new DictonaryEntry("Reinigen","Pflege/Vernachlässigung der eigenen Wohnung etc."));
	t.entryList.push(new DictonaryEntry("Wäsche waschen","Waschen, bügeln, ausbessern der Wäsche"));
	t.entryList.push(new DictonaryEntry("Wohnraum","Ausstattung des Wohnraumes"));
	t.entryList.push(new DictonaryEntry("Wirtschaftliche Situation","Einkommen, Vermögen, Schuldensituation, Regelung der finanziellen Angelegenheiten"));
	t.entryList.push(new DictonaryEntry("Soziale Kontakte / Kommunikation","verbale/nonverbale Informationsaustauschfähigkeit, sprachlicher Ausdruck etc vgl. auch AEDL 12"));
	t.entryList.push(new DictonaryEntry("Antrieb / Beschäftigung / Tagesstrukturierung","vgl. auch AEDL 9"));
	t.entryList.push(new DictonaryEntry("Selbstständige Lebensführung","Un-/selbständigkeit/Fremdabhängigkeit im Alltag, Körperhygiene, äußeres Erscheinungsbild, etc."));
	t.entryList.push(new DictonaryEntry("Zugang zu Versorgungsangeboten","medizinisch-therapeutische Angebote in örtlicher Nähe etc."));
	t.entryList.push(new DictonaryEntry("Nutzung von Versorgungs- / Dienstleistungsangeboten","Annahme von Hilfsangeboten etc."));
	t.entryList.push(new DictonaryEntry("Sozialverhalten","soziale Beziehungen, sozial-kommunikative Kompetenzen, Empathiefähigkeit"));
	t.entryList.push(new DictonaryEntry("Belastungen durch die Pflegesituation","Copingstrategien, Aggressivität, Kommunikation, Ratlosigkeit etc."));
	t.entryList.push(new DictonaryEntry("Überforderung durch die Pflegesituation","Copingstrategien, Aggressivität, Kommunikation, Ratlosigkeit etc."));
	t.entryList.push(new DictonaryEntry("Anderen belastenden Situationen","Frustrationstoleranz, Copingstrategien, Optimismus/Pessimismus etc. Vgl. AEDL 12"));
	t.entryList.push(new DictonaryEntry("Selbstwertgefühl","Einschätzung eigener Fähigkeiten, Selbstbild etc."));
	t.entryList.push(new DictonaryEntry("Krankheitseinsicht","Wahrnehmung körperlicher und geistiger Veränderungen, Realitätsbezug etc."));
	t.entryList.push(new DictonaryEntry("Körperliche und / oder seelische Gesundheit von Pflegepersonen in Familie / Umfeld","psychosomatische Erkrankungen/Robustheit etc."));
	t.entryList.push(new DictonaryEntry("Problemsicht von pflegenden Personen in Familie / Umfeld","Einsicht in Schwere der Erkrankung, übertriebene/realistische Problemsicht etc."));
	t.entryList.push(new DictonaryEntry("Allgemeine Situation Familie / Umfeld","vorhandene/fehlende familiäre Bindungen, Probleme/ Ressourcen in Partnerschaft/Ehe, familiäre Unterstützung etc."));
	t.entryList.push(new DictonaryEntry("Gesellschaftliche Teilhabe des Klienten","Teilnahme am gesellschaftlichen Leben, Interesse an öffentlichen Veranstaltungen etc."));
	t.entryList.push(new DictonaryEntry("Sonstiges","(Störungen der) Kommunikation im Hinblick auf Minderung von Hörvermögen, Sehvermögen, Sprachliche Probleme (Aphasien) ggf. auch Kognition, ggf. auch taktile Probleme Wahrnehmungsfähigkeit des Pflegebedürftigen, Ausdruck v. Gefühlen, Gestik, Mimik, die emotionalen Bedürfnisse, Sprache, Schreiben, Hören, Sehen, Erinnerung, Konzentrationsvermögen"));
	
	t.entryList.sort(utilsAutoComplete.callbackSortFunc);

	t.getMatches = function(xWord,opt_CurrentMatches){
	
		var currentMatches=[];
		if(xWord == null) return currentMatches;
		if(xWord.length < 3 ) return currentMatches;

		currentMatches =  t.getMatchingWordsEx(xWord,opt_CurrentMatches);

		if(currentMatches.length > 0) {
			t.currentMatches = currentMatches;
			return currentMatches;
		}
		return currentMatches;
	};
	t.getMatchingWordsEx = function(xKey,xCurrentMatches){
	
		var matches = new Array();

		if(xCurrentMatches.length == 0){
			for(i = 0; i<= t.entryList.length-1;i++)
			if(t.entryList[i].key.toLowerCase().indexOf(xKey.toLowerCase()) >=0){
			
				t.entryList[i].MatchingPhrase = xKey;
				matches.push(t.entryList[i]);
			}
		}else{
			if(xCurrentMatches[0].MatchingPhrase.length < xKey.length){
				for(i = 0; i<= xCurrentMatches.length-1;i++)
					if(xCurrentMatches[i].key.toLowerCase().indexOf(xKey.toLowerCase()) >=0){
								t.entryList[i].MatchingPhrase = xKey;
								matches.push(xCurrentMatches[i]);
					}
						
			}		
			else{
				for(i = 0; i<= t.entryList.length-1;i++)
						if(t.entryList[i].key.toLowerCase().indexOf(xKey.toLowerCase()) >=0){
							t.entryList[i].MatchingPhrase = xKey;
							matches.push(t.entryList[i]);
						}
			}
		}
		return matches;
	};
}
function DictonaryEntry(xKey,xValue){

		this.key = xKey;
		this.contentValue = xValue;
}
function AutoCompleteUI(){
	var t = this;
	t.entryList = $(document.createElement('ul'));
	t.entryContentParagraph  =  $(document.createElement('p'));
	t.entryContentWrapper =  $(document.createElement('div'));
	t.autoCompleteControl =  $(document.createElement('div'));
	t.SelectedItem = 0;
	t.entryList.addClass('AutoCompleteEntryList')
	t.autoCompleteControl.addClass("AutoCompleteControl");
	t.entryContentWrapper.addClass('entryContentWrapper');
	t.entryContentParagraph.addClass('entryContentParagraph');

	t.entryContentWrapper.append(t.entryContentParagraph);
	t.autoCompleteControl.append(t.entryList);
	t.autoCompleteControl.append(t.entryContentWrapper);
	$(document.body).append(t.autoCompleteControl);
	t.NavigateThroughList = function(textArea,key){
	
		switch (key.keyCode){
			case utilsAutoComplete.KEYCODEOBJ.DOWN:
				t.showNextListItem();
				
				return true;
			case utilsAutoComplete.KEYCODEOBJ.UP:
				t.ShowPreviuosListItem();
				
				return true;
			case utilsAutoComplete.KEYCODEOBJ.ESCAPE:
				t.hide();
				return true;
			case utilsAutoComplete.KEYCODEOBJ.ENTER:
				t.replaceCurrentSelection(textArea);
				t.hide();
				return true;
		}
		return false;
	};
	t.replaceCurrentSelection = function(textArea){
		var pReplaceText;
		var pReplaceBefore;
		var pReplaceAfter;
		var pEndIndex;
		var pStartIndex;
		var pCursorPosition;

		pCursorPosition = $(textArea.domObj).prop("selectionStart");
		currentText = "" + textArea.domObj.val();

		pEndIndex = pCursorPosition;
		pStartIndex = utilsAutoComplete.getSubStringTillPreviousSeperator(currentText,pCursorPosition);

		pReplaceBefore =  textArea.domObj.val().substring(0,pStartIndex);
		pReplaceAfter =  textArea.domObj.val().substring(pEndIndex);

		//pReplaceText =  $(entryList.children()[entryList.SelectedItem]).contentValue;
		pReplaceText = t.entryList.children()[t.SelectedItem].contentValue;
	
	 	textArea.domObj.val("" + pReplaceBefore + pReplaceText + pReplaceAfter);
	};
	t.hide = function(){
		t.autoCompleteControl.hide();	
		t.SelectedItem = -1;
	};
	t.show = function(){
		
		t.showListItemWithIndex(0);
		t.autoCompleteControl.show(400);
	};
	t.updateListView = function(xMatches){

		t.currentMatches = xMatches;

		if( t.entryList.children().length > xMatches.length){
			
			t.removeItems(xMatches);		
			
		}else{
			t.addNewItems(xMatches);
		}
		t.showListItemWithIndex(0);
		t.show();
	};
	t.removeItems = function(xRemoveItemsArray){
		var xChildList;
		var xRemoveItemsArray;
		var blnMatchFound  = false;
		var i = 0;
		var currentChild= 0;
		xChildList = t.entryList.children();
		//xRemoveItemsArray = t.currentMatches;

		while(xRemoveItemsArray.length !== xChildList.length){

			blnMatchFound  = false;

			for(var i = 0;  i <= xRemoveItemsArray.length-1;i++){

				if(xChildList[currentChild].key.toLowerCase()==xRemoveItemsArray[i].key.toLowerCase()){
					xChildList[currentChild].innerHTML = xRemoveItemsArray[i].key.replace(xRemoveItemsArray[i].MatchingPhrase,"<strong>"+xRemoveItemsArray[i].MatchingPhrase +"</strong>");
					blnMatchFound = true;
					break;
				}
			}
			if(!blnMatchFound ){
				xChildList[currentChild].parentElement.removeChild(xChildList[currentChild]);
				xChildList = t.entryList.children();
			}
			else{
				currentChild++;
			}
		}
	};
	t.addNewItems = function(xNewItemsArray){
		t.entryList.empty();
		//xNewItemsArray = t.currentMatches;
		for(var i =  0 ; i <= xNewItemsArray.length-1;i++){

			var tempLI = document.createElement("li");

			t.entryList.append(tempLI);
			tempLI.innerHTML = xNewItemsArray[i].key.replace(xNewItemsArray[i].MatchingPhrase,"<strong>"+xNewItemsArray[i].MatchingPhrase +"</strong>");
			tempLI.contentValue = xNewItemsArray[i].contentValue;
			tempLI.key = xNewItemsArray[i].key;
			tempLI = $(tempLI);
			tempLI.hide();
			tempLI.attr('tabindex', i+1)
			tempLI.addClass("defaultLI");
			tempLI.show(i*25);
		}

		$("li").mouseenter(function(){
			t.showListItem(this);
		
		});

		$("li").mouseleave(function(event) {
			t.setItemDefaultStyle($(this));
		
		});
	};
	t.setItemDefaultStyle = function(xIndex){
		
		if( xIndex <0 ) return;
		t.entryContentParagraph.text("");
		t.entryList.get(xIndex).removeClass("focusedLI");
		t.entryList.SelectedItem = -1;
	};
	t.setItemDefaultStyle = function(xIndex){
		t.entryContentParagraph.text("");
		xIndex.removeClass("focusedLI");
	};
	t.ShowPreviuosListItem = function(){
		
		t.showListItemWithIndex(t.SelectedItem-1);
	};
	t.showNextListItem = function(){
	
		t.showListItemWithIndex(t.SelectedItem+1);
	};
	t.showListItemWithIndex = function(xIndex){
		
		if(t.entryList.children().length == 0 ) return;
		if( xIndex <0 )  xIndex = t.entryList.children().length-1;
		if(xIndex>t.entryList.children().length-1) xIndex = 0;
		//Remove the old focusedLI
		$(t.entryList.children()[t.SelectedItem]).removeClass("focusedLI");

		xListItem = $(t.entryList.children()[xIndex]);
		t.entryContentParagraph.text(t.entryList.children()[xIndex].contentValue);
		xListItem.addClass('focusedLI');
		t.SelectedItem = xIndex;
	};
	t.showListItem = function(xListItem){
		t.entryContentParagraph.text(xListItem.contentValue);
		$(xListItem).addClass('focusedLI');
		t.SelectedItem = t.entryList.index(xListItem);	
	};
	t.postionInterface = function(selectedTextArea){
	    try{
	          var parent = selectedTextArea.domObj;
	          var position = parent.offset();
	          position.top += parent.outerHeight( true );
	          t.autoCompleteControl.offset(position);
	         //t.autoCompleteControl.css("width",parent.outerWidth( true ));
	         //t.autoCompleteControl.css("height",parent.outerHeight( true ));  
	      }catch(err){return false}
	      return true;
	};
}
function UtilsAutoComplete(){
	var t = this;

	t.sepList = new Array(" ",".","?","!","-",",",";",":","_","(",")","\"","\n","\t");
	t.callbackSortFunc = function(a,b){

		if(a.key == b.key){

			if(a.contentValue == b.contentValue){
				return 0;
			}

			return (a.contentValue < b.contentValue) ? -1 : 1;
		}

		return (a.key < b.key) ? -1 : 1;
	};
	t.KEYCODEOBJ ={
		BACKSPACE:8,
		COMMA: 818,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		LEFT: 37,
		NUMPAD_ADD: 107,
		NUMPAD_DECIMAL: 110,
		NUMPAD_DIVIDE: 111,
		NUMPAD_ENTER: 108,
		NUMPAD_MULTIPLY: 106,
		NUMPAD_SUBTRACT: 109,
		PAGE_DOWN: 34,
		PAGE_UP: 33,
		PERIOD: 190,
		RIGHT: 39,
		SPACE: 32,
		TAB: 9,
		UP: 38,
		ARROW_DOWN : -1
	};

	t.getSubStringTillPreviousSeperator = function(xText,xCurrentIndex){
	
		var pSubString;
		var pCurrentLastIndex;

		pSubString = xText.substring(0,xCurrentIndex);
		pCurrentLastIndex = 0;

		for(var i = 0; i <= t.sepList.length-1 ; i++)		
			if (pCurrentLastIndex < pSubString.lastIndexOf(t.sepList[i]))
					pCurrentLastIndex = pSubString.lastIndexOf(t.sepList[i]);
		
		if (pCurrentLastIndex >0) return pCurrentLastIndex+1;			//+1 so the seperator gets cut off
		return pCurrentLastIndex;
	};
}

